'''
当需要创建的子进程数量不多时可以直接利用multiprocessing中的Process动态成生多个进程，
但如果是上百甚至上千个目标，手动的去创建进程的工作量巨大，此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时，可以指定一个最大进程数，当有新的请求提交到Pool中时，
如果池还没有满，那么就会创建一个新的进程用来执行该请求;
但如果池中的进程数已经达到指定的最大值，那么该请求就会等待,直到池中有进程结束，才会创建新的进程来执行。

阻塞式:
非阻塞式:先全部添加到队列中，立刻返回，并没有等待其他进程执行完毕，但是回调函数是等待任务完成之后才调用
'''
import os
from multiprocessing import Pool
import time

# 非阻塞式进程
from random import random

def tack(task_name):
    print('开始做任务了',task_name)
    start = time.time()
    time.sleep(random()*2)
    end = time.time()
    # print('完成任务:{}!,用时:{},进程id:{}'.format(task_name,end-start,os.getpid()))
    return '任务:{}!,用时:{},进程id:{}'.format(task_name,end-start,os.getpid())

container = []
def callback_func(n):
    container.append(n)

if __name__ == '__main__':
    pool = Pool(5)

    tasks = ['听音乐','看电影','打游戏','写代码','写论文','做作业','写小说']
    for task1 in tasks:
        pool.apply_async(tack,args=(task1,),callback=callback_func)

    pool.close() #添加任务结束
    pool.join() #等待进程池中的任务执行完毕

    for i in container:
        print(i)
    print('主进程结束')











